package com.atguigu.transaction;

import com.atguigu.utils.DBUtils;

import java.sql.SQLException;

/**
 * 事务
 *   如何在java中开启MySQL事务
 *      1.关闭MySQL的事务自动提交设置  conn.setAutoCommit(false);
 *      2.提交事务  conn.commit();
 *      3.回滚    conn.rollback();
 *
 * @author hjwStrart
 * @time 2022-03-07 22:08
 */
public class TransactionTest {
    public static void main(String[] args) {

        test2();
    }

    //    A向B转账，A减500，B加500
    public static void test1() {
        String sql = "update user_table set balance = balance - 500 where user = ?";
        DBUtils.update(sql, "aa");
//        假设在转账过程中发生异常
        System.out.println(10/0);
//        发生异常后，AA的钱被扣了，但BB没收到
        String sql2 = "update user_table set balance = balance + 500 where user = ?";
        DBUtils.update(sql2, "bb");
        System.out.println("转账成功");

    }

    public static void test2(){
        String sql = "update user_table set balance = balance - 500 where user = ?";
        try {
            //            1.设置事务不自动提交
            DBUtils.conn.setAutoCommit(false);
            DBUtils.update(sql, "aa");
//        假设在转账过程中发生异常
//            System.out.println(10/0);
            String sql2 = "update user_table set balance = balance + 500 where user = ?";
            DBUtils.update(sql2, "bb");
            System.out.println("转账成功");
//            2.提交事务
            DBUtils.conn.commit();
        } catch (Exception e) {
//            3.发生异常，设置事务的回滚
            try {
                DBUtils.conn.rollback();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }finally {

//        关闭连接时，事务会被自动提交
            DBUtils.closeResource();
        }
    }
}
